/*
 * FreeRTOS V202411.00
 * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy of
 * this software and associated documentation files (the "Software"), to deal in
 * the Software without restriction, including without limitation the rights to
 * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 * the Software, and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 * https://www.FreeRTOS.org
 * https://github.com/FreeRTOS
 *
 */

/******************************************************************************
	See http://www.freertos.org/a00110.html for an explanation of the
	definitions contained in this file.
******************************************************************************/

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H

/*-----------------------------------------------------------
 * Application specific definitions.
 *
 * These definitions should be adjusted for your particular hardware and
 * application requirements.
 *
 * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
 * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
 * https://www.FreeRTOS.org/a00110.html
 *----------------------------------------------------------*/

extern uint32_t SystemCoreClock;

/* Cortex M33 port configuration. */
#define configENABLE_MPU								0	//是否启用 MPU（Memory Protection Unit，内存保护单元）。 启用后，可对任务访问的内存区域进行限制，提高系统安全性和稳定性。 通常仅在需要任务隔离的安全型系统中启用。
#define configENABLE_FPU								0	//是否启用 FPU（浮点运算单元） 支持。 启用后，FreeRTOS 会在任务切换时保存/恢复浮点寄存器。 如果你的任务中使用了浮点运算（如 float、double），应启用此选项；否则可禁用以减少上下文切换开销。
#define configENABLE_TRUSTZONE							0

/* Constants related to the behaviour or the scheduler. */
#define configUSE_PORT_OPTIMISED_TASK_SELECTION			0	//是否启用端口优化的任务选择算法。 启用后可利用硬件指令快速找到最高优先级任务，但仅部分架构支持。
#define configUSE_PREEMPTION							1	//是否启用抢占式调度。通常选择开启，启用后，高优先级任务会立即中断低优先级任务的执行，从而获得更高的实时性。
#define configUSE_TIME_SLICING							1
#define configMAX_PRIORITIES							( 5 )	//系统支持的最大任务优先级数量。 例如：56 表示可用优先级范围为 0~55。 设置得越大，任务优先级划分越细，但内核消耗的内存略增。
#define configIDLE_SHOULD_YIELD							1	//空闲任务是否允许让出 CPU。 启用后，如果有相同优先级的就绪任务，空闲任务会主动让出 CPU。
#define configUSE_16_BIT_TICKS							0 /* Only for 8 and 16-bit hardware. */	//是否使用 16 位节拍计数器。 禁用时使用 32 位计数器，可支持更长的系统运行时间。

/* Constants that describe the hardware and memory usage. */
#define configCPU_CLOCK_HZ								SystemCoreClock	// CPU 的时钟频率。用于计算时间片、延时及节拍定时器中断周期。 
#define configMINIMAL_STACK_SIZE						( ( uint16_t ) 128 )	//每个任务的最小堆栈大小（以字为单位）。 例如：128 Words。 用于指定任务运行时所需的堆栈空间。 建议根据任务需求和系统资源分配合理值。
#define configMINIMAL_SECURE_STACK_SIZE					( 1024 )
#define configMAX_TASK_NAME_LEN							( 12 )	//任务名称的最大长度（字符数）。 例如：16 表示每个任务的名称最长为 16 个字符。
#define configTOTAL_HEAP_SIZE							( ( size_t ) ( 5 * 1024 ) )	// 定义FreeRTOS可用于动态分配任务栈、队列等资源的堆内存总量。增大该值可支持更多任务或更大数据结构，但会占用更多RAM；减小则可能导致分配失败，需根据应用需求平衡。若使用静态则可以设置为0。

/* Constants that build features in or out. */
#define configUSE_MUTEXES								1	//是否启用 互斥锁（Mutex） 功能。 启用后可在任务间实现资源独占访问，防止竞争条件。
#define configUSE_TICKLESS_IDLE							1	//是否启用 Tickless Idle 模式。 启用后在系统空闲时暂停系统节拍中断，降低功耗。 适用于低功耗应用，但可能影响时间精度。
#define configUSE_APPLICATION_TASK_TAG					0	//是否启用任务标签功能。 启用后可为任务附加用户定义的标记或回调函数，用于调试或统计。
#define configUSE_NEWLIB_REENTRANT						0
#define configUSE_CO_ROUTINES							0	// 是否启用协程：Disabled。启用后，支持轻量级协程（非抢占式），适用于简单并发任务。禁用节省资源。协程不如任务灵活，官方已不建议使用，通常在旧版或资源极紧系统使用
#define configUSE_COUNTING_SEMAPHORES					1	//是否启用 计数型信号量。 用于控制多个资源的访问，或在多个事件发生后再触发任务。
#define configUSE_RECURSIVE_MUTEXES						1	//是否启用 递归互斥锁。 允许同一个任务多次获取同一互斥量，而不会造成死锁。
#define configUSE_QUEUE_SETS							0
#define configUSE_TASK_NOTIFICATIONS					1	//是否启用任务通知机制。 任务通知是一种轻量级的任务间通信方式，比信号量更高效。
#define configUSE_TRACE_FACILITY						1	//是否启用跟踪设施：Enabled。启用后，支持FreeRTOS的跟踪宏，用于记录事件和调试。禁用减少代码大小；启用便于使用工具如Tracealyzer分析系统行为，提高开发效率。

/* Constants that define which hook (callback) functions should be used. */
#define configUSE_IDLE_HOOK								0	//是否启用空闲钩子函数：Disabled。启用后，在空闲任务运行时调用用户定义的钩子函数，可用于低功耗模式或额外处理。禁用避免额外开销；启用适合需要在空闲时执行特定操作的应用。
#define configUSE_TICK_HOOK								0	//是否启用时钟节拍钩子函数：Disabled启用后，每次系统时钟中断时调用用户钩子函数，可用于周期性操作。禁用避免额外中断开销；启用适合定时监控，但会略微增加中断处理时间。
#define configUSE_MALLOC_FAILED_HOOK					0	//是否启用内存分配失败钩子函数：Disabled。启用后，当pvPortMalloc()失败时调用用户钩子函数，便于错误处理或日志记录。禁用忽略失败；启用提升调试能力，但需实现vApplicationMallocFailedHook()。

/* Constants provided for debugging and optimisation assistance. */
#define configCHECK_FOR_STACK_OVERFLOW					2	//是否启用栈溢出检查：Disabled。启用后，FreeRTOS在任务切换时检查栈溢出（方法1或2），可及早检测内存问题。禁用减少开销；启用提高可靠性，但会增加少量CPU负载。
#define configASSERT( x )								if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
#define configQUEUE_REGISTRY_SIZE						0	//队列注册表大小。 用于调试时在可视化工具（如 FreeRTOS+Trace）中查看任务间通信队列。 设置值代表可注册的队列数量，例如：8 表示最多可登记 8 个队列。

/* Software timer definitions. */
#define configUSE_TIMERS								1	//是否启用软件定时器：Enabled。启用后，支持基于FreeRTOS的软件定时器任务，用于延时回调。禁用节省一个任务和队列；启用简化应用定时逻辑，提高代码可读性。
#define configTIMER_TASK_PRIORITY						( 3 )	//定时器任务优先级：2。设置软件定时器守护任务的优先级。较高优先级确保定时器准时处理；较低可能导致延迟。修改需考虑与其他任务的相对优先级，以维持系统实时性。
#define configTIMER_QUEUE_LENGTH						5	//定时器队列长度：10。定义定时器命令队列的大小。增大支持更多并发定时器操作；减小节省内存。修改影响系统处理多个定时器的能力，避免队列满导致失败。
#define configTIMER_TASK_STACK_DEPTH					( configMINIMAL_STACK_SIZE  )	//定时器任务栈深度：256 Words。设置软件定时器任务的栈大小（单位：字，通常4字节）。增大防止栈溢出；减小节省RAM。需根据定时器回调复杂度估算，避免运行时错误。

/* Set the following definitions to 1 to include the API function, or zero
 * to exclude the API function.  NOTE:  Setting an INCLUDE_ parameter to 0 is
 * only necessary if the linker does not automatically remove functions that are
 * not referenced anyway. */
#define INCLUDE_vTaskPrioritySet						1
#define INCLUDE_uxTaskPriorityGet						1
#define INCLUDE_vTaskDelete								1
#define INCLUDE_vTaskCleanUpResources					0
#define INCLUDE_vTaskSuspend							1
#define INCLUDE_vTaskDelayUntil							1
#define INCLUDE_vTaskDelay								1
#define INCLUDE_uxTaskGetStackHighWaterMark				0
#define INCLUDE_xTaskGetIdleTaskHandle					0
#define INCLUDE_eTaskGetState							1
#define INCLUDE_xTaskResumeFromISR						0
#define INCLUDE_xTaskGetCurrentTaskHandle				1
#define INCLUDE_xTaskGetSchedulerState					0
#define INCLUDE_xSemaphoreGetMutexHolder				0
#define INCLUDE_xTimerPendFunctionCall					1

/* This demo makes use of one or more example stats formatting functions.  These
 * format the raw data provided by the uxTaskGetSystemState() function in to
 * human readable ASCII form.  See the notes in the implementation of vTaskList()
 * within FreeRTOS/Source/tasks.c for limitations. */
#define configUSE_STATS_FORMATTING_FUNCTIONS			1	//是否启用统计格式化函数：Disabled。启用后，提供函数如vTaskList()来格式化任务统计输出。禁用避免额外代码；启用便于通过串口或日志查看任务状态，适合调试阶段。

/* Dimensions a buffer that can be used by the FreeRTOS+CLI command interpreter.
 * See the FreeRTOS+CLI documentation for more information:
 * https://www.FreeRTOS.org/FreeRTOS-Plus/FreeRTOS_Plus_CLI/ */
#define configCOMMAND_INT_MAX_OUTPUT_SIZE				2048

/* Interrupt priority configuration follows...................... */

/* Use the system definition, if there is one. */
#ifdef __NVIC_PRIO_BITS
	#define configPRIO_BITS								__NVIC_PRIO_BITS
#else
	#define configPRIO_BITS								2	 /* 4 priority levels. */
#endif

/* The lowest interrupt priority that can be used in a call to a "set priority"
 * function. */
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY			0x03	//库最低中断优先级：15。定义STM32中断优先级的最低值（对于Cortex-M，通常0-15，0最高）。设置影响所有中断的范围；修改需匹配硬件，确保FreeRTOS syscall优先级正确。

/* Interrupt priorities used by the kernel port layer itself.  These are generic
 * to all Cortex-M ports, and do not rely on any particular library functions. */
#define configKERNEL_INTERRUPT_PRIORITY					( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << ( 8 - configPRIO_BITS ) )

/* Set configUSE_MPU_WRAPPERS_V1 to 0 to use new MPU wrapper.
 * See https://freertos.org/a00110.html#configUSE_MPU_WRAPPERS_V1 for details. */
#define configUSE_MPU_WRAPPERS_V1						( 0 )
/* Set configENABLE_ACCESS_CONTROL_LIST to 1 to use access control list.
 * See https://freertos.org/a00110.html#configENABLE_ACCESS_CONTROL_LIST for details. */
#define configENABLE_ACCESS_CONTROL_LIST				( 1 )
/* See https://freertos.org/a00110.html#configPROTECTED_KERNEL_OBJECT_POOL_SIZE for details. */
#define configPROTECTED_KERNEL_OBJECT_POOL_SIZE			( 150 )
/* See https://freertos.org/a00110.html#configSYSTEM_CALL_STACK_SIZE for details. */
#define configSYSTEM_CALL_STACK_SIZE					( 128 )

/* The #ifdef guards against the file being included from IAR assembly files. */
#ifndef __IASMARM__

	/* Constants related to the generation of run time stats. */
	#define configGENERATE_RUN_TIME_STATS				0	//是否启用运行时统计：Disabled。启用后，收集任务运行时间数据，用于性能分析。禁用节省资源；启用需实现定时器（如vConfigureTimerForRunTimeStats()），有助于优化任务调度。
	#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
	#define portGET_RUN_TIME_COUNTER_VALUE()			0
	#define configTICK_RATE_HZ							( ( TickType_t ) 1000 )

#endif /* __IASMARM__ */

/* Enable static allocation. */
#define configSUPPORT_STATIC_ALLOCATION					1

#endif /* FREERTOS_CONFIG_H */
